<?php

namespace maotool\core\response;

use maotool\core\lang\HttpStatusCode;
use maotool\log\Console;
use maotool\util\ProjectUtil;
use maotool\object\ReflectionUtil;

/**
 * JSON响应结果类
 * 
 * 用于生成标准化的JSON响应格式，包含状态码、消息、数据等信息。
 * 该类继承自Result类，提供了丰富的静态方法和实例方法来构建各种类型的响应。
 * 
 * 响应格式示例:
 * {
 *   "code": 200,
 *   "message": "请求成功",
 *   "name": "OK",
 *   "timestamp": 1623456789,
 *   "success": true,
 *   "data": {...}
 * }
 * 
 * 使用示例:
 * // 成功响应
 * return JsonResult::ok($data);
 * 
 * // 错误响应
 * return JsonResult::error("操作失败", 500);
 * 
 * // 自定义响应
 * $result = new JsonResult();
 * $result->setCode(200);
 * $result->setMessage("操作成功");
 * $result->setData($data);
 * return $result->getResult();
 */
class JsonResult extends Result
{

    /**
     * @var array 存储响应结果的数组
     */
    protected $result = [];

    /**
     * 构造函数
     * 
     * @param mixed $data 响应数据
     */
    public function __construct($data = null)
    {
        $this->setData($data);
        $this->setLogs(Console::$lines);
    }

    /**
     * 创建成功的响应 (200 OK)
     * 
     * @param mixed $data 响应数据
     * @param string $message 响应消息
     * @param int $code HTTP状态码
     * @return mixed 格式化的响应数组
     */
    public static function ok($data = null, $message = HttpStatusCode::OK["message"], $code = HttpStatusCode::OK["code"])
    {
        return self::success($data, $message, $code);
    }

    /**
     * 创建成功的响应 (200 OK) - 简短别名
     * 
     * @param mixed $data 响应数据
     * @param string $message 响应消息
     * @param int $code HTTP状态码
     * @return mixed 格式化的响应数组
     */
    public static function suc($data = null, $message = HttpStatusCode::OK["message"], $code = HttpStatusCode::OK["code"])
    {
        return self::success($data, $message, $code);
    }

    /**
     * 创建成功的响应 (200 OK) - 主要方法
     * 
     * @param mixed $data 响应数据
     * @param string $message 响应消息
     * @param int $code HTTP状态码
     * @return mixed 格式化的响应数组
     */
    public static function success($data = null, $message = HttpStatusCode::OK["message"], $code = HttpStatusCode::OK["code"])
    {
        $r = new static();
        $r->setCode($code);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::OK["name"]);
        $r->setTimestamp(time());
        $r->setSuccess(true);
        $r->setData($data);
        return $r->getResult();
    }

    /**
     * 创建失败的响应 (500 Internal Server Error)
     * 
     * @param string $message 错误消息
     * @param int $code HTTP状态码
     * @param mixed $data 响应数据
     * @return mixed 格式化的响应数组
     */
    public static function fail($message = HttpStatusCode::INTERNAL_SERVER_ERROR["message"], $code = HttpStatusCode::INTERNAL_SERVER_ERROR["code"], $data = null)
    {
        return self::error($message, $code, $data);
    }

    /**
     * 创建失败的响应 (500 Internal Server Error) - 简短别名
     * 
     * @param string $message 错误消息
     * @param int $code HTTP状态码
     * @param mixed $data 响应数据
     * @return mixed 格式化的响应数组
     */
    public static function err($message = HttpStatusCode::INTERNAL_SERVER_ERROR["message"], $code = HttpStatusCode::INTERNAL_SERVER_ERROR["code"], $data = null)
    {
        return self::error($message, $code, $data);
    }

    /**
     * 创建失败的响应 (500 Internal Server Error) - 主要方法
     * 
     * @param string $message 错误消息
     * @param int $code HTTP状态码
     * @param mixed $data 响应数据
     * @return mixed 格式化的响应数组
     */
    public static function error($message = HttpStatusCode::INTERNAL_SERVER_ERROR["message"], $code = HttpStatusCode::INTERNAL_SERVER_ERROR["code"], $data = null)
    {
        $r = new static();
        $r->setCode($code);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::INTERNAL_SERVER_ERROR["name"]);
        $r->setTimestamp(time());
        $r->setSuccess(false);
        $r->setData($data);
        return $r->getResult();
    }

    /**
     * 创建资源创建成功的响应 (201 Created)
     * 
     * @param mixed $data 响应数据
     * @param string $message 响应消息
     * @param int $code HTTP状态码
     * @return mixed 格式化的响应数组
     */
    public static function created($data = null, $message = HttpStatusCode::CREATED["message"], $code = HttpStatusCode::CREATED["code"])
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode($code);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::CREATED["name"]);
        $r->setSuccess(true);
        $r->setData($data);
        return $r->getResult();
    }

    /**
     * 创建资源未找到的响应 (404 Not Found)
     * 
     * @return mixed 格式化的响应数组
     */
    public static function unfound()
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode(HttpStatusCode::NOT_FOUND["code"]);
        $r->setMessage(HttpStatusCode::NOT_FOUND["message"]);
        $r->setName(HttpStatusCode::NOT_FOUND["name"]);
        $r->setSuccess(false);
        return $r->getResult();
    }

    /**
     * 创建未授权的响应 (401 Unauthorized)
     * 
     * @param string $message 响应消息
     * @return mixed 格式化的响应数组
     */
    public static function unauthorized($message = HttpStatusCode::UNAUTHORIZED["message"])
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode(HttpStatusCode::UNAUTHORIZED["code"]);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::UNAUTHORIZED["name"]);
        $r->setSuccess(false);
        return $r->getResult();
    }

    /**
     * 创建禁止访问的响应 (403 Forbidden)
     * 
     * @param string $message 响应消息
     * @return mixed 格式化的响应数组
     */
    public static function forbidden($message = HttpStatusCode::FORBIDDEN["message"])
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode(HttpStatusCode::FORBIDDEN["code"]);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::FORBIDDEN["name"]);
        $r->setSuccess(false);
        return $r->getResult();
    }

    /**
     * 创建请求错误的响应 (400 Bad Request)
     * 
     * @param string $message 响应消息
     * @return mixed 格式化的响应数组
     */
    public static function badRequest($message = HttpStatusCode::BAD_REQUEST["message"])
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode(HttpStatusCode::BAD_REQUEST["code"]);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::BAD_REQUEST["name"]);
        $r->setSuccess(false);
        return $r->getResult();
    }

    /**
     * 创建请求超时的响应 (408 Request Timeout)
     * 
     * @param string $message 响应消息
     * @return mixed 格式化的响应数组
     */
    public static function requestTimeout($message = HttpStatusCode::REQUEST_TIMEOUT["message"])
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode(HttpStatusCode::REQUEST_TIMEOUT["code"]);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::REQUEST_TIMEOUT["name"]);
        $r->setSuccess(false);
        return $r->getResult();
    }

    /**
     * 创建参数验证失败的响应 (422 Unprocessable Entity)
     * 
     * @param string $message 响应消息
     * @param mixed $data 响应数据
     * @return mixed 格式化的响应数组
     */
    public static function validationError($message = HttpStatusCode::UNPROCESSABLE_ENTITY["message"], $data = null)
    {
        $r = new static();
        $r->setTimestamp(time());
        $r->setCode(HttpStatusCode::UNPROCESSABLE_ENTITY["code"]);
        $r->setMessage($message);
        $r->setName(HttpStatusCode::UNPROCESSABLE_ENTITY["name"]);
        $r->setSuccess(false);
        $r->setData($data);
        return $r->getResult();
    }

    /**
     * 获取响应状态码
     * 
     * @return int HTTP状态码
     */
    public function getCode()
    {
        return $this->result["code"];
    }

    /**
     * 设置响应状态码
     * 
     * @param int $code HTTP状态码
     */
    public function setCode($code)
    {
        $this->result["code"] = $code;
    }

    /**
     * 获取响应状态名称
     * 
     * @return string HTTP状态名称
     */
    public function getName()
    {
        return $this->result["name"];
    }

    /**
     * 设置响应状态名称
     * 
     * @param string $name HTTP状态名称
     */
    public function setName($name)
    {
        $this->result["name"] = $name;
    }

    /**
     * 获取响应消息 (别名方法)
     * 
     * @return string 响应消息
     */
    public function getMsg()
    {
        return $this->result["msg"];
    }

    /**
     * 设置响应消息 (别名方法)
     * 
     * @param string $msg 响应消息
     */
    public function setMsg($msg)
    {
        $this->result["message"] = $msg;
    }

    /**
     * 获取响应消息
     * 
     * @return string 响应消息
     */
    public function getMessage()
    {
        return $this->result["message"];
    }

    /**
     * 设置响应消息
     * 
     * @param string $message 响应消息
     */
    public function setMessage($message)
    {
        $this->result["message"] = $message;
    }

    /**
     * 获取响应时间戳
     * 
     * @return int 时间戳
     */
    public function getTimestamp()
    {
        return $this->result["timestamp"];
    }

    /**
     * 设置响应时间戳
     * 
     * @param int $timestamp 时间戳
     */
    public function setTimestamp($timestamp)
    {
        $this->result["timestamp"] = $timestamp;
    }

    /**
     * 获取哈希值
     * 
     * @return string 哈希值
     */
    public function getHash()
    {
        return $this->result["hash"];
    }

    /**
     * 设置哈希值
     * 
     * @param string $hash 哈希值
     */
    public function setHash($hash)
    {
        $this->result["hash"] = $hash;
    }

    /**
     * 获取类型
     * 
     * @return string 类型
     */
    public function getType()
    {
        return $this->result["type"];
    }

    /**
     * 设置类型
     * 
     * @param string $type 类型
     */
    public function setType($type)
    {
        $this->result["type"] = $type;
    }

    /**
     * 获取版本号
     * 
     * @return string 版本号
     */
    public function getVersion()
    {
        return $this->result["version"];
    }

    /**
     * 设置版本号
     * 
     * @param string $version 版本号
     */
    public function setVersion($version)
    {
        $this->result["version"] = $version;
    }

    /**
     * 获取API信息
     * 
     * @return string API信息
     */
    public function getApi()
    {
        return $this->result["api"];
    }

    /**
     * 设置API信息
     * 
     * @param string $api API信息
     */
    public function setApi($api)
    {
        $this->result["api"] = $api;
    }

    /**
     * 检查是否为调试模式
     * 
     * @return bool 是否为调试模式
     */
    public function isDebug()
    {
        return $this->result["debug"];
    }

    /**
     * 设置调试模式
     * 
     * @param bool $debug 是否为调试模式
     */
    public function setDebug($debug)
    {
        $this->result["debug"] = $debug;
    }

    /**
     * 获取元数据
     * 
     * @return array 元数据
     */
    public function getMetadata()
    {
        return $this->result["metadata"];
    }

    /**
     * 设置元数据
     * 
     * @param array $metadata 元数据
     */
    public function setMetadata($metadata)
    {
        $this->result["metadata"] = $metadata;
    }

    /**
     * 获取成功状态 (数字形式)
     * 
     * @return int 成功状态 (1表示成功，0表示失败)
     */
    public function getIsSuccess()
    {
        return $this->result["isSuccess"];
    }

    /**
     * 设置成功状态 (数字形式)
     * 
     * @param int $isSuccess 成功状态 (1表示成功，0表示失败)
     */
    public function setIsSuccess($isSuccess)
    {
        $this->result["isSuccess"] = $isSuccess;
        $this->result["success"] = $isSuccess == 1;
    }

    /**
     * 获取成功状态 (布尔形式)
     * 
     * @return bool 是否成功
     */
    public function getSuccess()
    {
        return $this->result["success"];
    }

    /**
     * 设置成功状态 (布尔形式)
     * 
     * @param bool $success 是否成功
     */
    public function setSuccess($success)
    {
        $this->result["success"] = $success;
        $this->result["isSuccess"] = $success ? 1 : 0;
    }

    /**
     * 获取日志ID
     * 
     * @return string 日志ID
     */
    public function getLogId()
    {
        return $this->result["logId"];
    }

    /**
     * 设置日志ID
     * 
     * @param string $logId 日志ID
     */
    public function setLogId($logId)
    {
        $this->result["logId"] = $logId;
    }

    /**
     * 获取布局信息
     * 
     * @return string 布局信息
     */
    public function getLayout()
    {
        return $this->result["layout"];
    }

    /**
     * 设置布局信息
     * 
     * @param string $layout 布局信息
     */
    public function setLayout($layout)
    {
        $this->result["layout"] = $layout;
    }

    /**
     * 获取IP地址
     * 
     * @return string IP地址
     */
    public function getIp()
    {
        return $this->result["ip"];
    }

    /**
     * 设置IP地址
     * 
     * @param string $ip IP地址
     */
    public function setIp($ip)
    {
        $this->result["ip"] = $ip;
    }

    /**
     * 获取语言
     * 
     * @return string 语言
     */
    public function getLang()
    {
        return $this->result["lang"];
    }

    /**
     * 设置语言
     * 
     * @param string $lang 语言
     */
    public function setLang($lang)
    {
        $this->result["lang"] = $lang;
    }

    /**
     * 获取响应数据
     * 
     * @return mixed 响应数据
     */
    public function getData()
    {
        return $this->result["data"];
    }

    /**
     * 设置响应数据
     * 
     * @param mixed $data 响应数据
     */
    public function setData($data)
    {
        if ($data instanceof PageResult) {
            $this->result["data"] = $data->getResult();
        } else {
            $this->result["data"] = $data;
        }
    }

    /**
     * 获取日志信息
     * 
     * @return array 日志信息
     */
    public function getLogs()
    {
        return $this->result['logs'];
    }

    /**
     * 设置日志信息
     * 
     * @param array $logs 日志信息
     */
    public function setLogs($logs)
    {
        $this->result['logs'] = $logs;
    }

    /**
     * 获取更多数据
     * 
     * @return array 更多数据
     */
    public function getMore()
    {
        return $this->result['more'];
    }

    /**
     * 设置更多数据
     * 
     * @param array $more 更多数据
     */
    public function setMore($more)
    {
        $this->result['more'] = $more;
    }

    /**
     * 获取列信息
     * 
     * @return array 列信息
     */
    public function getColumn()
    {
        return $this->result['column'];
    }

    /**
     * 设置列信息
     * 
     * @param array $column 列信息
     */
    public function setColumn($column)
    {
        $this->result['column'] = $column;
    }

    /**
     * 获取路由信息
     * 
     * @return mixed 路由信息
     */
    public function getRoute()
    {
        return $this->result['route'];
    }

    /**
     * 设置路由信息
     * 
     * @param mixed $route 路由信息
     */
    public function setRoute($route)
    {
        $this->result['route'] = $route;
    }

    /**
     * 获取视图信息
     * 
     * @return mixed 视图信息
     */
    public function getView()
    {
        return $this->result['view'];
    }

    /**
     * 设置视图信息
     * 
     * @param mixed $view 视图信息
     */
    public function setView($view)
    {
        $this->result['view'] = $view;
    }

    /**
     * 获取分页信息
     * 
     * @return mixed 分页信息
     */
    public function getPaginate()
    {
        return $this->result['paginate'];
    }

    /**
     * 设置分页信息
     * 
     * @param mixed $paginate 分页信息
     */
    public function setPaginate($paginate)
    {
        $this->result['paginate'] = $paginate;
    }

    /**
     * 获取页面信息
     * 
     * @return mixed 页面信息
     */
    public function getPage()
    {
        return $this->result['page'];
    }

    /**
     * 设置页面信息
     * 
     * @param mixed $page 页面信息
     */
    public function setPage($page)
    {
        $this->result['page'] = $page;
    }

    /**
     * 获取搜索信息
     * 
     * @return mixed 搜索信息
     */
    public function getSearch()
    {
        return $this->result['search'];
    }

    /**
     * 设置搜索信息
     * 
     * @param mixed $search 搜索信息
     */
    public function setSearch($search)
    {
        $this->result['search'] = $search;
    }

    /**
     * 获取权限信息
     * 
     * @return mixed 权限信息
     */
    public function getPermissions()
    {
        return $this->result['permissions'];
    }

    /**
     * 设置权限信息
     * 
     * @param mixed $permissions 权限信息
     */
    public function setPermissions($permissions)
    {
        $this->result['permissions'] = $permissions;
    }

    /**
     * 获取过期时间
     * 
     * @return mixed 过期时间
     */
    public function getExpireTime()
    {
        return $this->result['expireTime'];
    }

    /**
     * 设置过期时间
     * 
     * @param mixed $expireTime 过期时间
     */
    public function setExpireTime($expireTime)
    {
        $this->result['expireTime'] = $expireTime;
    }

    /**
     * 获取表单信息
     * 
     * @return mixed 表单信息
     */
    public function getForm()
    {
        return $this->result['form'];
    }

    /**
     * 设置表单信息
     * 
     * @param mixed $form 表单信息
     */
    public function setForm($form)
    {
        $this->result['form'] = $form;
    }

    /**
     * 获取选择信息
     * 
     * @return mixed 选择信息
     */
    public function getSelect()
    {
        return $this->result['select'];
    }

    /**
     * 设置选择信息
     * 
     * @param mixed $select 选择信息
     */
    public function setSelect($select)
    {
        $this->result['select'] = $select;
    }

    /**
     * 获取树形结构信息
     * 
     * @return mixed 树形结构信息
     */
    public function getTree()
    {
        return $this->result['tree'];
    }

    /**
     * 设置树形结构信息
     * 
     * @param mixed $tree 树形结构信息
     */
    public function setTree($tree)
    {
        $this->result['tree'] = $tree;
    }

    /**
     * 获取URL信息
     * 
     * @return mixed URL信息
     */
    public function getUrl()
    {
        return $this->result['url'];
    }

    /**
     * 设置URL信息
     * 
     * @param mixed $url URL信息
     */
    public function setUrl($url)
    {
        $this->result['url'] = $url;
    }

    /**
     * 获取完整信息
     * 
     * @return mixed 完整信息
     */
    public function getFull()
    {
        return $this->result['full'];
    }

    /**
     * 设置完整信息
     * 
     * @param mixed $full 完整信息
     */
    public function setFull($full)
    {
        $this->result['full'] = $full;
    }

    /**
     * 获取令牌
     * 
     * @return mixed 令牌
     */
    public function getToken()
    {
        return $this->result['token'];
    }

    /**
     * 设置令牌
     * 
     * @param mixed $token 令牌
     */
    public function setToken($token)
    {
        $this->result['token'] = $token;
    }

    /**
     * 获取访问令牌
     * 
     * @return mixed 访问令牌
     */
    public function getAccessToken()
    {
        return $this->result['accessToken'];
    }

    /**
     * 设置访问令牌
     * 
     * @param mixed $accessToken 访问令牌
     */
    public function setAccessToken($accessToken)
    {
        $this->result['accessToken'] = $accessToken;
    }

    /**
     * 获取刷新令牌
     * 
     * @return mixed 刷新令牌
     */
    public function getRefreshToken()
    {
        return $this->result['refreshToken'];
    }

    /**
     * 设置刷新令牌
     * 
     * @param mixed $refreshToken 刷新令牌
     */
    public function setRefreshToken($refreshToken)
    {
        $this->result['refreshToken'] = $refreshToken;
    }

    /**
     * 获取过期时间（秒）
     * 
     * @return mixed 过期时间（秒）
     */
    public function getExpiresIn()
    {
        return $this->result['expiresIn'];
    }

    /**
     * 设置过期时间（秒）
     * 
     * @param mixed $expiresIn 过期时间（秒）
     */
    public function setExpiresIn($expiresIn)
    {
        $this->result['expiresIn'] = $expiresIn;
    }

    /**
     * 获取最终结果
     * 
     * @return mixed 最终结果
     */
    public function getResult()
    {
        if (ProjectUtil::isThinkphp()) {
            return ReflectionUtil::method("think\Response::create", [$this->result, 'json', $this->getCode()]);
        } else {
            return $this->result;
        }
    }

    /**
     * 设置结果
     * 
     * @param mixed $result 结果数组
     */
    public function setResult($result)
    {
        $this->result = $result;
    }

}